import { EncryptTransist } from "../../utils/data/encrypt_transist";
import { CheckIdNum, CheckPhone } from "../../utils/function/tools";

/**
 * @class 注册填写表单内容
 */
export class SignUpForm {
  private Info: any;
  private Type: string;
  private FilePath: Array<any> = [];
  constructor(type: string) {
    this.Type = type;
    if(type == 'student') {
      this.Info = {
        name: '', // 姓名
        idnum: '', // 身份证
        phone: '', // 电话
        province: '', // 省份
        schoolname: '', // 学校
        grade: '', // 年级
        class: '', // 班级
        birthday: '', // 生日
        district: '', // 地区
        city: '', // 城市
        sex: '', // 性别
        aller: '', // 备注
        header: '', // 头像
        sexid: '', // 性别序号
        education: '', // 在读学历
        registerdate: '', // 注册时间
        openid: '', // OPENID
      }
    }
    else if(type == 'parent') {
      this.Info = {
        name: '', // 姓名
        sex: '', // 性别
        idnum: '', // 身份证号
        province: '', // 省份
        city: '', // 城市
        district: '', // 地区
        phone: '', // 电话
        header: '', // 头像
        sexid: '', // 性别id
        openid: '', // openid
      }
    }
    else {
      // 导师
      this.Info = {
        name: '', // 姓名
        idnum: '', // 身份证
        phone: '', // 电话
        province: '', // 省份
        birthday: '', // 生日
        district: '', // 地区
        city: '', // 城市
        sex: '', // 性别
        // header: '', // 头像
        schoolname: '', // 学校
        resume: '', // 简历
        sexid: '', // 性别序号
        type: '', // 导师类型
        openid: '', // OPENID
      }
    }
  }
  /**
   * @function 返回信息
   */
  public listInfo = () => {
    return this.Info;
  }
  /**
   * @function 判断是否有空
   */
  public checkInfo = () => {
    return new Promise((resolve, reject) => {
      if(this.Type == 'student' && this.Info.aller.length == 0) {
        this.Info.aller = '无';
      }
      for(let key in this.Info) {
        if(this.Info[key].length == 0 && key != 'birthday' && key != 'sex' && key != 'sexid' && key != 'registerdate') {
          if(key == 'province' || key == 'city' || key == 'district') {
            reject({key: key, msg: '地区不能为空'});
            return;
          }
          if(this.Type == 'teacher' && this.Info.type != '2' && key == 'schoolname') {
            continue; // 非学校老师无需学校项
          }
          reject({key: key, msg: 'empty'});
          return;
        }
      }
      // 手机号合法性验证
      if(!CheckPhone(this.Info.phone)) {
        reject({key: 'phone', msg: '手机号错误'});
        return;
      }
      // 身份证有效性验证和生日性别判断
      const idNum = this.Info.idnum;
      if(!CheckIdNum(idNum)) {
        reject({key: 'idnum', msg: '身份证错误'});
        return;
      }
      const year = idNum.substring(6, 10);
      const month = idNum.substring(10, 12);
      const day = idNum.substring(12, 14);
      this.Info.birthday = `${year}-${month}-${day}`;
      this.Info.sex = parseInt(idNum[16]) % 2 == 0 ? '女' : '男';
      this.Info.sexid = this.Info.sex == '女' ? '2' : '1';
      // 获取注册日期
      if(this.Type == 'student') {
        this.Info.registerdate = new Date().toLocaleDateString().replace(/\//g, '-');
      }
      else if(this.Type == 'teacher') {
        // 非学校老师删除schoolname项
        if(this.Info.type != '2') {
          delete this.Info.schoolname;
        }
      }
      resolve({msg: 'success'});
    })
  }
  /**
   * @function 录入信息
   */
  public setInfo = async (key: string, value: string | number): Promise<void> => {
    return new Promise((resolve, reject) => {
      if(value === +value) {
        value = value.toString();
      }
      if(key == 'header' || key == 'resume') {
        this.FilePath.push(value);
      }
      if(key in this.Info) {
        this.Info[key] = value;
        resolve();
        return;
      }
      reject();
    })
  }
  /**
   * @function 打包加密
   */
  public encrypt = async (): Promise<any> => {
    return new Promise((resolve, reject) => {
      this.checkInfo() // 合法性检查
      .then((res: any) => {
        delete this.Info.header; // 删除头像属性
        const encryptor = new EncryptTransist(); // 加密容器
        const result: {key: string, data: string} = encryptor.Encrypt(JSON.stringify(this.Info)); // 加密
        resolve(result); // 返回结果
      })
      .catch((err: any) => {
        reject(err); // 检查不通过
      })
    })
  }
  /**
   * @function 获取头像临时目录 
   */
  public getFileTempPath = () => {
    return this.FilePath;
  }
}
